#! /bin/sh
#
# @@@ START COPYRIGHT @@@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#
# @@@ END COPYRIGHT @@@

# Some test suites contain tests that cannot be run concurrently with other tests.
# These test suites are executed in two passes.  The first pass executes tests
# concurrently with other tests.  The second pass executes exclusive tests sequentially.
# The -concurrent and -exclusive command line options indicate which pass to execute.
# Most test suites execute completely during the -concurrent pass.  The -exclusive
# pass is used only for test suites containing tests that cannot be executed concurrently
# with other tests.

# Set defaults: MX-format tables; sequential execution
sqlmxtbls=1
table_format='sb'
ssd='../tools'
concurrent_execution=0
exclusive_execution=0
log_qualifier=
diffs=0
failed=0

# Parse command line options.  Options must appear on the command line before
# test names.
while [ "$#" -gt 0 ]; do
  case "$1" in
    -concurrent)
      concurrent_execution=1
      shift
      ;;

    -exclusive)
      exclusive_execution=1
      log_qualifier='.excl'
      shift
      ;;

    -sb)
      sqlmxtbls=1
      table_format='sb'
      export SEABASE_REGRESS=2
      shift
      ;;

    -diff)
      diffs=1
      shift
      ;;

    -failed)
      failed=1
      shift
      ;;

    -ssd)
      ssd=${2:?'The -ssd option requires an argument'}
      shift 2
      ;;

    *)
      break
      ;;
  esac
done

if [ "$diffs" -eq 1 -a "$table_format" == "sb" ]; then
  export SEABASE_REGRESS_DIFFS=1
fi

export SQLMX_REGRESS=1
export SQLMX_NAMETYPE=ANSI
echo "***** Running SQL regressions *****"

$REGR_PREOP		# you can set this envvar to any command you like
			# e.g.  export REGR_PREOP="cp $HOME/setupnskenv $RGRT"

export NULL=/dev/null
export NSK=0
export LINUX=1
if [ "$scriptsdir" != "" ]; then
  pushd $scriptsdir/tools > $NULL 
  . ./setuplnxenv
  popd > $NULL
fi

if [ -r $ssd/setupenv ]; then	# second, generic pan-platform setup
  . $ssd/setupenv
elif [ "$scriptsdir" != "" ]; then
  . $scriptsdir/tools/setupenv
fi

test "$scriptsdir" = "" && echo Scripts root dir env var \$scriptsdir not set. && exit 1
test "$rundir" = "" && echo Run root dir env var \$rundir not set. && exit 1

export mxcmpdir=${mxcmpdir:-$arkcmpdir}
export TEMP=${TMP:-${TEMP:-$rundir/tmp}}
test -f $TEMP -a ! -d $TEMP && TEMP=$rundir/tmpdir
test ! -d $TEMP && mkdir -p $TEMP
test ! -d $TEMP -o ! -w $TEMP && TEMP=/tmp

if [ ! -e $scriptsdir/tools/logsort_linux.exe ]; then
  if [ "$scriptsdir/tools/logsort_src" != "" ]; then
    pushd $scriptsdir/tools/logsort_src > $NULL
    sh makeit_linux.ksh
    popd > $NULL
    mv -f $scriptsdir/tools/logsort_src/logsort.exe $scriptsdir/tools/logsort_linux.exe
  fi
fi

export LOGSORT=$scriptsdir/tools/logsort_linux.exe
export  FILTER=$scriptsdir/tools/regress-filter-linux

export MAKEPARAMS="$mxcmpdir $mxcidir"
export MAKEOBJTYP=o
export mxci=$mxcidir/sqlci
export mxcmp=$mxcmpdir/tdm_arkcmp
export mxudr=$mxcmpdir/tdm_udrserv
export javahome=${JAVA_HOME}
export java=$javahome/bin/java
export javac=$javahome/bin/javac
export jar=$javahome/bin/jar
export NSK_SYS=NSK
linuxinit=$scriptsdir/tools/linuxinit

# export synonyms for convenience
export sqlci=$mxci
export arkcmp=$mxcmp
export arkcmpdir=$mxcmpdir
export nsk=$NSK
export TMP=$TEMP

# determine regression directories and logs
export REGRBASDIR=$(basename $PWD)
export REGRRUNDIR=$rundir/$REGRBASDIR
export REGRTSTDIR=$scriptsdir/$REGRBASDIR
export rgrlog=$REGRRUNDIR/runregr-${table_format}${log_qualifier}.log
export rgrStats=$REGRRUNDIR/runregr-${table_format}${log_qualifier}.stats
export REGRTOOLSDIR=$scriptsdir/tools

export REGRCONCURRENT="$concurrent_execution"
export REGREXCLUSIVE="$exclusive_execution"

# setup up make file script, same for mx and mp
export MAKESCRIPT=$scriptsdir/tools/makefileall.ksh

# Single-quoted versions of the REGR* variables
export REGRBASDIR_Q="'$REGRBASDIR'"
export REGRRUNDIR_Q="'$REGRRUNDIR'"
export REGRTSTDIR_Q="'$REGRTSTDIR'"
export REGRRUNDIR_QCleanup="'$REGRRUNDIR/cleanup'"
export REGRRUNDIR_QAB="'$REGRRUNDIR/A/B'"

######################################################
#these tests are run as part of checktests. Used by runregr_checktest*.ksh
#They are skipped by individual tests if 'runallsb' script is used to
#run multiple suites and checktests is part of it.
#That way we avoid running the same tests multiple times: once as part of
#checktests and then as part of individual test.

# "orig" tests are the original tests that need to be run.
# non-orig are the ones currently being run due to existing issues with
# some tests in the orig list.
export coreCT="TEST000 TEST001 TEST002 TEST005 TEST032 TEST056 TEST116 TESTRTS"
export compGeneralCT="TEST006 TEST015 TEST042 TESTTOK"
export charsetsCT="TEST001 TEST311"
export executorCT="TEST013 TEST015 TEST022 TEST107"
export fullstack2CT="TEST062"

export hiveCTorig="TEST001 TEST005 TEST009 TEST015 TEST021 TEST031 TEST041 TEST046 TEST055"
export hiveCT="TEST001 TEST005 TEST009 TEST015 TEST017 TEST021"

export seabaseCT="TEST002 TEST003 TEST010 TEST011 TEST022 TEST025 TEST030 TEST031"
export udrCT="TEST002"
export privs1CT="TEST120 TEST137"

export privs2CTorig="TEST145"
#export privs2CT="TEST145"
export privs2CT=""
####################################

tmplocal=$TMP/`basename $0 .ksh`.tmp

# Make sure sed commands in $FILTER work --
# otherwise all regressions will come up with ostensible zero diffs
# (falsely reporting SUCCESS)
# because all .flt files will contain the same sed error message!
#
# This can happen when the $FILTER is not write-protected by ClearCase,
# for instance on NSK, and you inadvertently type a stray character
# while looking at the file in an editor.
#
test ! -x $FILTER && chmod +rwx $FILTER		# ensure we can run it
$FILTER $NULL					# run it (emits errmsg if bad)
test $? -ne 0 && echo && echo "ERROR: Your copy of $FILTER is broken." && exit 1

flavor1=
if [ "$diffs" -ne 1 -o "$table_format" != "sb" ]; then
  echo 'select TESTEXIT;' > $tmplocal.flavor.tmp
  flavor1=`$sqlci -i $tmplocal.flavor.tmp | grep 15001`
fi
flavor2=
if [ "$flavor1" = "" ]; then
  flavor1=DEBUG
  # enable NA memory overflow checking during test
  export MEMDEBUG=2
else
  flavor1=RELEASE
fi
export BUILD_FLAVOR_TEXT="($flavor1$flavor2 build)"
export BUILD_FLAVOR=`echo $flavor1 | tr A-Z a-z`	# case-sensitive filename lookup (most runregr_xxx.ksh use lowercase for "expectednnn.nsk*")


tool=$scriptsdir/tools/runregr_$REGRBASDIR.ksh
if [ ! -f $tool ]; then
  tool=$scriptsdir/tools/runregr_other.ksh
fi
if [ "$diffs" -eq 1 ]; then
  echo "Command requested: $tool -diff $*"
else
  echo "Command requested: $tool $*"
fi
echo "Build flavor is: $BUILD_FLAVOR_TEXT"
export PATH="$scriptsdir/tools:$PATH"

# Create the FilteredLogs directory
FilteredLogs=$scriptsdir/FilteredLogs
if [ ! -d "$FilteredLogs" ]; then
  echo "Creating directory $FilteredLogs"
  mkdir $FilteredLogs
fi

if [ ! -d "$FilteredLogs/win" ]; then
  echo "Creating directory $FilteredLogs/win"
  mkdir $FilteredLogs/win
fi
FilteredLogs=$FilteredLogs/win

if [ ! -d "$FilteredLogs/$REGRBASDIR" ]; then
  echo "Creating directory $FilteredLogs/$REGRBASDIR"
  mkdir $FilteredLogs/$REGRBASDIR
fi
export FilteredLogs="$FilteredLogs/$REGRBASDIR"

#Delete files left from previous run
rm -f core dumpfile sh_histo ZZSA*


#Establish log, exp and bsl directories
if [ ! -d "$FilteredLogs/logfiles" ]; then
  echo "Creating directory $FilteredLogs/logfiles"
  mkdir $FilteredLogs/logfiles
fi
if [ ! -d "$FilteredLogs/expfiles" ]; then
  echo "Creating directory $FilteredLogs/expfiles"
  mkdir $FilteredLogs/expfiles
fi
echo "Using the following directory for filtered logs:   $FilteredLogs"

if [ "$failed" -eq 1 ]; then
  rm -f $REGRRUNDIR/runregr-failed.log 2>$NULL
  echo "Command executed: $tool -diff $* "
  $tool -diff $* > $REGRRUNDIR/runregr-failed.log
  ff=`cat $REGRRUNDIR/runregr-failed.log | grep ' ### FAIL ' | cut -c 22-28 ` 2>$NULL

  if [ "$ff" == "" ]; then
     echo "No failed tests, nothing to execute."
     rm -f $REGRRUNDIR/runregr-failed.log 2>$NULL
     echo "No failed tests." > $REGRRUNDIR/runregr-failed.log
  else
    failedTests=
    for i in $ff; do
      failedTests="$failedTests $i"
    done
    echo "Command executed: $tool $failedTests"
    $tool $failedTests
    rm -f $REGRRUNDIR/runregr-failed.log 2>$NULL
    cp $rgrlog $REGRRUNDIR/runregr-failed.log 2>$NULL
  fi
elif [ "$diffs" -eq 1 ]; then
  echo "Command executed: $tool -diff $*"
  $tool -diff $*
else
  echo "Command executed: $tool $*"
  $tool $*
fi


# Concatentate logs for test suites that are executed in separate
# concurrent and sequential phases.  The exclusive phase is executed
# after the concurrent phase, so the logs are concatenated at the end
# of the exclusive phase.
if [ "$REGREXCLUSIVE" -ne 0 ]; then
  normal_log="$REGRRUNDIR/runregr-mx.log"
  if [ -a "$normal_log" ]; then
    exclusive_log="$rgrlog"
    echo 'Exclusive (sequential) tests:' | \
      cat - "$exclusive_log" >>"$normal_log" && rm "$exclusive_log"
    rgrlog="$normal_log"
  else
    echo "Error: Log file $normal_log doesn't exist!"
  fi
fi

export REGR_POSTOP="$scriptsdir/tools/rgrCleanup"
echo $REGR_POSTOP
$REGR_POSTOP		# you can set this envvar to any command you like
			# e.g.  export REGR_POSTOP="$HOME/bin/rgrCleanup"
echo "***** Done running regressions *****"
